package com.aiguigu.gulimall.product.utils;

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.io.IOException;
import java.util.List;
import java.util.Objects;

/**
 * @Author: wangjj
 * @Date: 2020/11/4 15:53
 * @Description pdf生成工具类
 */
@Slf4j
public class PdfCreateUtil {

    /**
     * @return com.itextpdf.text.Document
     * @Author Yangy
     * @Description 创建document
     * @Date 16:24 2020/11/5
     * @Param []
     **/
    public static Document getDocumentInstance() {
        //此处方法可以初始化document属性，document默认A4大小
        Document document = new Document();
        return document;
    }

    /**
     * @return com.itextpdf.text.Document
     * @Author Yangy
     * @Description 设置document基本属性
     * @Date 16:24 2020/11/5
     * @Param [document]
     **/
    public static Document setDocumentProperties(Document document, String title, String author, String subject, String keywords, String creator) {
        // 标题
        document.addTitle(title);
        // 作者
        document.addAuthor(author);
        // 主题
        document.addSubject(subject);
        // 关键字
        document.addKeywords(keywords);
        // 创建者
        document.addCreator(creator);
        return document;
    }

    /**
     * @return com.itextpdf.text.Paragraph
     * @Author Yangy
     * @Description 创建段落，可设置段落通用格式
     * @Date 16:24 2020/11/5
     * @Param []
     **/
    public static Paragraph getParagraph(String content, Font fontStyle, int align, int lineIdent, float leading) {
        //设置内容与字体样式
        Paragraph p = new Paragraph(content, fontStyle);
        //设置文字居中 0=靠左,1=居中,2=靠右
        p.setAlignment(align);
        //首行缩进
        p.setFirstLineIndent(lineIdent);
        //设置左缩进
//		p.setIndentationLeft(12);
        //设置右缩进
//		p.setIndentationRight(12);
        //行间距
        p.setLeading(leading);
        //设置段落上空白
        p.setSpacingBefore(5f);
        //设置段落下空白
        p.setSpacingAfter(10f);
        return p;
    }

    /**
     * @return com.itextpdf.text.Image
     * @Author Yangy
     * @Description 获取图片
     * @Date 16:39 2020/11/5
     * @Param [imgUrl]
     **/
    public static Image getImage(String imgUrl, int align, int percent) {
        Image image = null;
        try {
            image = Image.getInstance(imgUrl);
        } catch (BadElementException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //设置图片位置
        image.setAlignment(align);
        //依照比例缩放
        image.scalePercent(percent);
        return image;
    }

    /**
     * @return com.itextpdf.text.pdf.PdfPTable
     * @Author Yangy
     * @Description 创建表格
     * @Date 16:43 2020/11/5
     * @Param [dataList=数据集合，maxWidth=表格最大宽度，align=位置（0，靠左   1，居中     2，靠右）
     **/
    public static PdfPTable getTable(List<List<String>> dataList, int maxWidth, int align, Font font) {
        if (Objects.isNull(dataList) || dataList.size() == 0) {
            log.warn("data list is empty when create table");
            return null;
        }

        int columns = dataList.get(0).size();
        PdfPTable table = new PdfPTable(columns);
        table.setTotalWidth(maxWidth);
        table.setLockedWidth(true);
        table.setHorizontalAlignment(align);
        //设置列边框0-无，1-有
        table.getDefaultCell().setBorder(0);

        //此处可自定义表的每列宽度比例，但需要对应列数
//		int width[] = {10,45,45};//设置每列宽度比例
//		table.setWidths(width);
        table.setHorizontalAlignment(Element.ALIGN_CENTER);//居中
        //边距:单元格的边线与单元格内容的边距
        table.setPaddingTop(1f);
        //间距：单元格与单元格之间的距离
        table.setSpacingBefore(0);
        table.setSpacingAfter(0);
        table.getDefaultCell().setBorder(0);

        for (int i = 0; i < dataList.size(); i++) {
            for (int j = 0; j < dataList.get(i).size(); j++) {
                table.addCell(createCell(dataList.get(i).get(j), font));
            }
        }

        return table;
    }

    /**
     * @return com.itextpdf.text.pdf.PdfPCell
     * @Author Yangy
     * @Description 自定义表格列样式属性
     * @Date 16:54 2020/11/5
     * @Param [value, font]
     **/
    private static PdfPCell createCell(String value, Font font) {
        PdfPCell cell = new PdfPCell();
        //设置列纵向位置，居中
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        //设置列横向位置，居中
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        cell.setPhrase(new Phrase(value, font));
        return cell;
    }

    /**
     * @return com.itextpdf.text.Font
     * @Author Yangy
     * @Description 获取自定义字体
     * @Date 11:38 2020/11/6
     * @Param [size=字大小, style=字风格, fontFamily=字体, color=颜色]
     **/
    public static Font setFont(float size, int style, String fontFamily, BaseColor color)
            throws IOException, DocumentException {
        //设置中文可用
        BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
        Font font = new Font(bfChinese, size, style);
        font.setFamily(fontFamily);
        font.setColor(color);
        return font;
    }

    /**
     * @return xxx.xxx.data.util.PdfCreateUtil.Watermark
     * @Author Yangy
     * @Description 创建水印设置
     * @Date 12:04 2020/11/6
     * @Param [markContent]
     **/
    public static Watermark createWaterMark(String markContent) throws IOException, DocumentException {
        return new Watermark(markContent);
    }

    /**
     * @Author Yangy
     * @Description 设置水印
     * @Date 12:03 2020/11/6
     * @Param
     * @return
     **/
    public static class Watermark extends PdfPageEventHelper {
        Font FONT = PdfCreateUtil.setFont(30f, Font.BOLD, "", new GrayColor(0.95f));
        private String waterCont;//水印内容

        public Watermark() throws IOException, DocumentException {

        }

        public Watermark(String waterCont) throws IOException, DocumentException {
            this.waterCont = waterCont;
        }

        @Override
        public void onEndPage(PdfWriter writer, Document document) {
            for (int i = 0; i < 5; i++) {
                for (int j = 0; j < 5; j++) {
                    ColumnText.showTextAligned(writer.getDirectContentUnder(),
                            Element.ALIGN_CENTER,
                            new Phrase(StringUtils.isEmpty(this.waterCont) ? "" : this.waterCont, FONT),
                            (50.5f + i * 350),
                            (40.0f + j * 150),
                            writer.getPageNumber() % 2 == 1 ? 45 : -45);
                }
            }
        }
    }

    public static HeaderFooter createHeaderFooter() {
        return new HeaderFooter();
    }

    /**
     * @Author Yangy
     * @Description 页眉/页脚
     * @Date 12:25 2020/11/6
     * @Param
     * @return
     **/
    public static class HeaderFooter extends PdfPageEventHelper {
        // 总页数
        PdfTemplate totalPage;
        Font hfFont;

        {
            try {
                hfFont = setFont(8, Font.NORMAL, "", BaseColor.BLACK);
            } catch (DocumentException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        // 打开文档时，创建一个总页数的模版
        @Override
        public void onOpenDocument(PdfWriter writer, Document document) {
            PdfContentByte cb = writer.getDirectContent();
            totalPage = cb.createTemplate(30, 16);
        }

        // 一页加载完成触发，写入页眉和页脚
        @Override
        public void onEndPage(PdfWriter writer, Document document) {
            PdfPTable table = new PdfPTable(3);
            try {
                table.setTotalWidth(PageSize.A4.getWidth() - 100);
                table.setWidths(new int[]{24, 24, 3});
                table.setLockedWidth(true);
                table.getDefaultCell().setFixedHeight(-10);
                table.getDefaultCell().setBorder(Rectangle.BOTTOM);

                table.addCell(new Paragraph("我是页眉/页脚", hfFont));
                table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT);
                table.addCell(new Paragraph("第" + writer.getPageNumber() + "页/", hfFont));
                // 总页数
                PdfPCell cell = new PdfPCell(Image.getInstance(totalPage));
                cell.setBorder(Rectangle.BOTTOM);
                table.addCell(cell);
                // 将页眉写到document中，位置可以指定，指定到下面就是页脚
                table.writeSelectedRows(0, -1, 50, PageSize.A4.getHeight() - 20, writer.getDirectContent());
            } catch (Exception de) {
                throw new ExceptionConverter(de);
            }
        }

        // 全部完成后，将总页数的pdf模版写到指定位置
        @Override
        public void onCloseDocument(PdfWriter writer, Document document) {
            String text = "总" + (writer.getPageNumber()) + "页";
            ColumnText.showTextAligned(totalPage, Element.ALIGN_LEFT, new Paragraph(text, hfFont), 2, 2, 0);
        }
    }
}

